﻿using Microsoft.Office.Interop.Excel;
using System.Diagnostics;
using System.Collections.Generic;

namespace Zuordnung {
    class ExcelFabrik {
        // könnte ich auch private machen
        public static Application xlapp = null;
        public static int processid = 0;

        /// <summary>
        /// Do not call Quit on the object, but quit from this class
        /// </summary>
        /// <returns></returns>
        public static bool open() {
            if (processid > 0)
                return true;
            Process[] pa1, pa2;
            List<int> pa2s = new List<int>();
            pa1 = Process.GetProcessesByName("EXCEL");
            xlapp = new Application();
            pa2 = Process.GetProcessesByName("EXCEL");
            for (int i = 0; i < pa2.Length; i++) {
                pa2s.Add(pa2[i].Id);
            }
            for (int i = 0; i < pa1.Length; i++) {
                pa2s.Remove(pa1[i].Id);
            }
            if (pa2s.Count == 1) {
                processid = pa2s.ToArray()[0];
                return true;
            }
            return false;
        }

        /// <summary>
        /// Applikation soll alle workbooks vorher schließen.
        /// </summary>
        public static string quit() {
            string result = "";
            // Excel kann mittlerweile von einem anderen Programm benutzt werden.
            // Ein Hinweis dafür ist daß es Worksheets enthält.
            // Excel darf nur geschlossen werden wenn keine Arbeitsmappen geöffnet sind.
            if (xlapp == null)
                return "";
            int workbookcount = xlapp.Workbooks.Count;
            if (workbookcount  > 0) {
                return "Excel enthält  " + workbookcount + " Arbeitsmappe(n), wird also anderweitig benutzt";
            }
            xlapp.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlapp); // Final schlecht
            System.GC.Collect();
            // learn: wann läßt .NET Excel los? Anscheinend immer beim Anzeigen der Messagebox. Wieso kann ich mit Sleep nicht dasselbe erreichen?
            /// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            try {
                for (int i=1; i<= 0; i++) { // NICHT BENUTZT
                    System.Threading.Thread.Sleep(300);
                    Process pa3 = Process.GetProcessById(processid);
                    if (i == 5) {
                        // pa3.Kill();
                        //processid = 0;
                        result += "Die Beendigung von Excel.exe mit Prozess-Id "+processid+ " ist gefordert, aber noch nicht erfolgt. ";
                    }
                }
            } catch (System.ArgumentException ae) {
                // das ist das gewünschte Ergebnis.
                // es gibt den Prozess nicht mehr
                processid = 0;
                result += " Excel hat sich beendet " + ae.Message;  
            }
            return result;
        }

    }
}
